home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / c / pro14 / bm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-04-02  |  2.3 KB  |  87 lines

  1. #include <stdio.h>
  2. /*#include <fcntl.h>
  3. #include <sys/types.h>
  4. #include <sys/file.h> */
  5. /* #include <strings.h> */
  6. #include "bm.h"
  7. #include "Extern.h"
  8. #define O_RDONLY BREAD    /* works for C86 */
  9.  
  10. char BigBuff[MAXBUFF + 2];
  11.     /* We leave one extra character at the beginning and end of the buffer,
  12.     * but don't tell Execute about it. This is so when someone is
  13.     * scanning the buffer and scans past the end (or beginning)
  14.     * we are still technically in the buffer (picky, but there ARE
  15.     * machines which would complain) */
  16.  
  17. main(argc,argv)
  18. int argc;
  19. char *argv[];
  20. {
  21.     /* test driver for grep based on Boyer-Moore algorithm */
  22.     int ret = 1, /* return code from Execute */
  23.         NFiles,
  24.         NPats; /* number of patterns to search for */
  25.     char i,
  26.         *FlagPtr,
  27.         **OptPtr; /* used to scan command line */
  28.     int TextFile /* file to search */;
  29.     struct PattDesc *DescVec[MAXPATS];
  30.  
  31.     --argc;
  32.     OptPtr = argv + 1;
  33.     while ( argc && **OptPtr == '-') {
  34.         FlagPtr = *OptPtr + 1;
  35.         while (*FlagPtr) {
  36.             switch (*FlagPtr) {
  37.                 case 'c': cFlag = 1; break;
  38.                 case 'f': fFlag = 1; 
  39.                     /* read the patterns from a file */
  40.                     NPats = GetPatFile(*++OptPtr,DescVec);
  41.                     --argc;
  42.                     break;
  43.                 case 'l': lFlag = 1; break;
  44.                 case 'n': nFlag = 1; break;
  45.                 case 's': sFlag = 1; break;
  46.                 case 'x': xFlag = 1; break;
  47.                 default:
  48.                     fprintf(stderr,
  49.                     "bm: invalid option: -%c \n",
  50.                     *FlagPtr);
  51.                     PutUsage();
  52.                     exit(2);
  53.             } /* switch */
  54.             ++FlagPtr;
  55.         } /* while */
  56.         ++OptPtr; --argc;
  57.     } /* while */
  58.     /* OptPtr now points to patterns */
  59.     if (!fFlag) {
  60.         if (!argc) {
  61.             fprintf(stderr,"bm: no pattern specified\n");
  62.             PutUsage();
  63.             exit(2);
  64.         } else
  65.             NPats = MkDescVec(DescVec,*OptPtr);
  66.         ++OptPtr; --argc;
  67.     }
  68.     /* OptPtr now points to first file */
  69.     NFiles = argc;
  70.     if (!NFiles)
  71.         ret &= Execute(DescVec,NPats,0,BigBuff+1);
  72.     else while (argc--) {
  73.         if ((NFiles > 1) || lFlag) FileName = *OptPtr;
  74.         if ((TextFile = open(*OptPtr,O_RDONLY,0)) < 0) {
  75.             fprintf(stderr,"bm: can't open %s\n",*OptPtr);
  76.             exit(2);
  77.         } /* if */
  78.         ret &= Execute(DescVec,NPats,TextFile,BigBuff+1);
  79.         if (sFlag && !ret)
  80.             exit(0);
  81.         ++OptPtr;
  82.         close(TextFile);
  83.     } /* while */
  84.     if (cFlag) printf("%d\n",MatchCount);
  85.     exit(ret);
  86. } /* main */
  87.